/**
 * @FileName: commonConnectionPool.h
 * @Author: 李波(Edwin Lee)
 * @Date: 2024-04-18 19:09:55
 * @Version: 1.0
 * @Description:实现连接池功能模块，单例模式
 */
#ifndef __COMMONCONNECTIONPOOL_H__
#define __COMMONCONNECTIONPOOL_H__
#include "public.h"
#include "connection.h"
#include <atomic>
#include <queue>
#include <mutex>
#include <functional>
#include <memory>
#include <thread>
#include <iostream>
#include <condition_variable>
using namespace std;
class ConnectionPool:NoCopyable
{
public:
	//获取唯一实例
	static ConnectionPool& getInstance();
	//给外部提供接口,从连接池中获取一个可用的空闲链接
	shared_ptr<Connection> getConnection();
private:
	//单例 构造函数
	ConnectionPool();
	//加载配置文件
	bool loadConfigFile(string filename="mysqlConnectPool.cnf");
	//运行在独立的线程中，专门负责生产新链接
	void produceConnectionTask();
	//回收超时的空闲链接
	void recyleConnectionTask();

	string ip_;                    //mysql的ip
	unsigned short port_;          //mysql的端口号3306
	string dbname_;                //需要链接的数据库名
	string username_;              //mysql登录的用户名
	string password_;              //mysql登录密码
	int initSize_;                 //连接池的初始链接量
	int maxSize_;                  //连接池的最大链接量
	int maxIdleTime_;              //连接池最大空闲时间
	int connectionTimeout_;        //连接池获取链接的超时时间
	
	queue<Connection*> connectionQue_;//存储mysql链接的队列
	mutex queueMutex_;             //维护链接队列的线程安全互斥锁
	atomic_int connCount_;         //记录链接所创建的connection链接的总数量
	condition_variable cond_;      //设置条件变量，用于生产和消费线程的通信
};

#endif
